package common

import (
	"errors"
	"io"
	"net"
	"os"
	"reflect"
	"strings"
	"time"
)

const (
	MessageMaxFrameSize   = 4096                                   // 消息分片阈值：当消息长度超过此值时，自动分片传输，4KB，可根据实际场景调整
	WebsocketGUID         = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" // 协议规定的固定GUID
	ServerShutdownTimeout = 5 * time.Second                        // 服务器关闭的超时时间
)

// IsClosedErr 判断错误是否为连接关闭错误
func IsClosedErr(err error) bool {
	// 标准关闭错误
	if errors.Is(err, ErrCloseSent) || errors.Is(err, io.EOF) {
		return true
	}

	// 检查 net.ErrClosed
	var netErr *net.OpError
	if errors.As(err, &netErr) {
		// 处理 Windows 特有的 "forcibly closed" 错误
		if os.PathSeparator == '\\' && strings.Contains(netErr.Error(), "forcibly closed") {
			return true
		}
		// 检查连接已关闭的错误
		if netErr.Op == "read" && netErr.Err != nil && strings.Contains(netErr.Err.Error(), "closed") {
			return true
		}
	}

	return false
}

// maxIntValue 获取当前系统 int 类型的最大允许值（动态适配 32/64 位系统）
func maxIntValue() int64 {
	// 注：int 最大值在 32 位系统是 2^31-1，64 位系统是 2^63-1
	switch reflect.TypeOf(0).Bits() { // 获取 int 类型的位数
	case 32:
		return 1<<31 - 1 // 32 位系统 int 最大值：2^31 - 1
	case 64:
		return 1<<63 - 1 // 64 位系统 int 最大值：2^63 - 1
	default:
		return 0 // 理论上不会出现，作为安全兜底
	}
}

// maskPayload 对 payload 应用掩码 mask 进行异或处理
func maskPayload(payload []byte, mask [4]byte) {
	for i := range payload {
		payload[i] ^= mask[i%4]
	}
}
